/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.nys.conci.usuario.bean;

import com.nys.conci.base.BeanBase;
import com.nys.conci.base.excepcion.ExcepcionManager;
import com.nys.conci.base.utilitario.EtiquetasUtil;
import com.nys.conci.base.utilitario.MensajeUtil;
import com.nys.conci.usuario.entidad.EstadoUsuario;
import com.nys.conci.usuario.entidad.Usuario;
import com.nys.conci.usuario.servicio.ServicioAdministracion;
import com.nys.conci.usuario.servicio.ServicioControlUsuario;
import java.util.ArrayList;
import java.util.List;
import javax.annotation.PostConstruct;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.event.PhaseId;
import javax.inject.Inject;
import org.primefaces.event.SelectEvent;

/**
 *
 * @author Yeudy10
 * @since 29/01/2013
 */
@ManagedBean
@ViewScoped
public class BeanRegistroEstadoUsuario extends BeanBase {

//<<<<<<<<<<<<<<<<<<<<<<<<<<<<*******************<<<<<<<<<<<<<<<<<<<<<<<<<<<<
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<     VARIABLES     >>>>>>>>>>>>>>>>>>>>>>>>>>>>
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<*******************<<<<<<<<<<<<<<<<<<<<<<<<<<<<
    @Inject
    private ServicioAdministracion sa;
    @Inject
    private ServicioControlUsuario scc;
    private EstadoUsuario estadoUsuario;
    private EstadoUsuario estadoUsuarioSelect;
    private EstadoUsuario estadoUsuarioTabla;
    private List<EstadoUsuario> lista_estado_usuario;
    private String nombre;
    private String descripcion;
    private String numero;
    boolean modificar;

//<<<<<<<<<<<<<<<<<<<<<<<<<<<<*******************<<<<<<<<<<<<<<<<<<<<<<<<<<<<
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<  INICIALIZARORES  >>>>>>>>>>>>>>>>>>>>>>>>>>>>
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<*******************<<<<<<<<<<<<<<<<<<<<<<<<<<<<
    /**
     * Constructor
     */
    public BeanRegistroEstadoUsuario() {
        this.inicializar();
    }

    /**
     * Inicializa las variables del bean, al acceder al constructor
     */
    private void inicializar() {
        try {
            setNombre("");
            setDescripcion("");
            setEstadoUsuario(new EstadoUsuario());
            setEstadoUsuarioSelect(new EstadoUsuario());
            setEstadoUsuarioTabla(new EstadoUsuario());
            setLista_estado_usuario(new ArrayList<EstadoUsuario>());
            setModificar(false);
            numero = "1";
        } catch (Exception ex) {
            ExcepcionManager.manejarExcepcion(ex);
        }
    }

    /**
     * Inicializas las variables y atributos del bean, despues del llamado del
     * constructor. Es utilizado para las inicializaciones que utilicen datos de
     * objetos injectados.
     */
    @Override
    @PostConstruct
    public void inicializarPost() {
        cargarEstadosUsuario();
    }

//<<<<<<<<<<<<<<<<<<<<<<<<<<<<*******************<<<<<<<<<<<<<<<<<<<<<<<<<<<<
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<      MÉTODOS      >>>>>>>>>>>>>>>>>>>>>>>>>>>>
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<*******************<<<<<<<<<<<<<<<<<<<<<<<<<<<<
    /**
     * Método que carga una lista con estados de usuario
     */
    public void cargarEstadosUsuario() {
        try {
            lista_estado_usuario = new ArrayList<EstadoUsuario>();
            lista_estado_usuario = sa.consultarListaEstadoUsuarios();
        } catch (Exception ex) {
            ExcepcionManager.manejarExcepcion(ex);
        }
    }

    /**
     * Método que guarda o actualiza un estado de usuario
     */
    public void agregarEstadoUsuario() {
        try {
            if (validarCampos()) {
                if (modificar) {
                    estadoUsuarioSelect.setDescripcion(getDescripcion());
                    estadoUsuarioSelect.setNombre(getNombre());
                    sa.guardarEstadoUsuario(estadoUsuarioSelect, modificar);
                } else {
                    setEstadoUsuario(new EstadoUsuario());
                    getEstadoUsuario().setDescripcion(getDescripcion());
                    getEstadoUsuario().setNombre(getNombre());
                    sa.guardarEstadoUsuario(estadoUsuario, modificar);
                }
                cargarEstadosUsuario();
                limpiar();
                numero = "1";
                modificar = false;
            }
        } catch (Exception ex) {
            ExcepcionManager.manejarExcepcion(ex);
        }
    }

    /**
     * Método que limpia los campos de la pantalla
     */
    public void limpiar() {
        try {
            nombre = "";
            descripcion = "";
            estadoUsuario = new EstadoUsuario();
            estadoUsuarioSelect = new EstadoUsuario();
            estadoUsuarioTabla = new EstadoUsuario();
            modificar = false;
            numero = "0";
        } catch (Exception ex) {
            ExcepcionManager.manejarExcepcion(ex);
        }
    }

    /**
     * Método que valida si los campos del usuario estan correctos
     *
     * @return true si estan correctos de lo contrario false
     */
    private boolean validarCampos() {
        boolean resultado = true;
        if (getNombre() == null || getNombre().trim().isEmpty()) {
            String mensaje = EtiquetasUtil.obtenerEtiqueta("campo.requerido.parametro", "Nombre");
            MensajeUtil.agregarMensajeErrorComponente("form_conci:id_acordion:id_nombre", mensaje);
            resultado = false;
        }
        if (getDescripcion() == null || getDescripcion().trim().isEmpty()) {
            String mensaje = EtiquetasUtil.obtenerEtiqueta("campo.requerido.parametro", "Descripción");
            MensajeUtil.agregarMensajeErrorComponente("form_conci:id_acordion:id_descripcion", mensaje);
            resultado = false;
        }
        if (lista_estado_usuario != null && nombre != null && !nombre.isEmpty()) {
            boolean va = false;
            for (EstadoUsuario estado : lista_estado_usuario) {
                if (modificar && !estado.getId_estado().equals(estadoUsuarioSelect.getId_estado()) && estado.getNombre().equals(nombre)) {
                    va = true;
                } else if (!modificar && estado.getNombre().equals(nombre)) {
                    va = true;
                }
            }
            if (va) {
                String mensaje = "No se permite ingresar estados de usuario con nombres iguales";
                MensajeUtil.agregarMensajeError(mensaje);
                resultado = false;
            }
        }
        return resultado;
    }

    /**
     * Método ejecutado cuando selecciono un campo de la tabla
     */
    public void modificarEstadoUsuario() {
        try {
            estadoUsuarioSelect = estadoUsuarioTabla;
            modificar = true;
            setDescripcion(estadoUsuarioSelect.getDescripcion());
            setNombre(estadoUsuarioSelect.getNombre());
            numero = "0";
        } catch (Exception ex) {
            ExcepcionManager.manejarExcepcion(ex);
        }
    }

    /**
     * Método que elimina un estado del usuario
     */
    public void eliminarEstadoUsuario() {
        try {
            if (validarUsados()) {
                sa.eliminar(estadoUsuarioSelect);
                limpiar();
                cargarEstadosUsuario();
                numero = "1";
                setDescripcion("");
                setNombre("");
                String mensaje = "Se eliminó el estado seleccionado";
                MensajeUtil.agregarMensajeInfo(mensaje);
            }
        } catch (Exception ex) {
            ExcepcionManager.manejarExcepcion(ex);
        }
    }
    /**
     * Método que valida si el estado de un usuario esta siendo utilizado
     * @return true o false
     */
    private boolean validarUsados() {
        try {
            Usuario us = new Usuario();
            us = scc.consultarUsuarioIdEstado(estadoUsuarioSelect.getId_estado());
            if (us != null) {
                String mensaje = "No se puede eliminar, el estado se encuentra asociado a un usuario";
                MensajeUtil.agregarMensajeError(mensaje);
                return false;
            }
        } catch (Exception ex) {
            ExcepcionManager.manejarExcepcion(ex);
        }
        return true;
    }

//<<<<<<<<<<<<<<<<<<<<<<<<<<<<*******************<<<<<<<<<<<<<<<<<<<<<<<<<<<<
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<      GET & SET      >>>>>>>>>>>>>>>>>>>>>>>>>>>>
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<*******************<<<<<<<<<<<<<<<<<<<<<<<<<<<<
    /**
     * @return the modificar
     */
    public boolean isModificar() {
        return modificar;
    }

    /**
     * @param modificar the modificar to set
     */
    public void setModificar(boolean modificar) {
        this.modificar = modificar;
    }

    /**
     * @return the nombre
     */
    public String getNombre() {
        return nombre;
    }

    /**
     * @param nombre the nombre to set
     */
    public void setNombre(String nombre) {
        this.nombre = nombre;
    }

    /**
     * @return the descripcion
     */
    public String getDescripcion() {
        return descripcion;
    }

    /**
     * @param descripcion the descripcion to set
     */
    public void setDescripcion(String descripcion) {
        this.descripcion = descripcion;
    }

    /**
     * @return the estadoUsuario
     */
    public EstadoUsuario getEstadoUsuario() {
        return estadoUsuario;
    }

    /**
     * @param estadoUsuario the estadoUsuario to set
     */
    public void setEstadoUsuario(EstadoUsuario estadoUsuario) {
        this.estadoUsuario = estadoUsuario;
    }

    /**
     * @return the estadoUsuarioSelect
     */
    public EstadoUsuario getEstadoUsuarioSelect() {
        return estadoUsuarioSelect;
    }

    /**
     * @param estadoUsuarioSelect the estadoUsuarioSelect to set
     */
    public void setEstadoUsuarioSelect(EstadoUsuario estadoUsuarioSelect) {
        this.estadoUsuarioSelect = estadoUsuarioSelect;
    }

    /**
     * @return the estadoUsuarioTabla
     */
    public EstadoUsuario getEstadoUsuarioTabla() {
        return estadoUsuarioTabla;
    }

    /**
     * @param estadoUsuarioTabla the estadoUsuarioTabla to set
     */
    public void setEstadoUsuarioTabla(EstadoUsuario estadoUsuarioTabla) {
        this.estadoUsuarioTabla = estadoUsuarioTabla;
    }

    /**
     * @return the lista_estado_usuario
     */
    public List<EstadoUsuario> getLista_estado_usuario() {
        return lista_estado_usuario;
    }

    /**
     * @param lista_estado_usuario the lista_estado_usuario to set
     */
    public void setLista_estado_usuario(List<EstadoUsuario> lista_estado_usuario) {
        this.lista_estado_usuario = lista_estado_usuario;
    }

    /**
     * @return the numero
     */
    public String getNumero() {
        return numero;
    }

    /**
     * @param numero the numero to set
     */
    public void setNumero(String numero) {
        this.numero = numero;
    }
}
